package xcmg.device.dao.mapper.delivery;


import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import xcmg.device.dao.entity.delivery.DeliveryNoteDetailDO;
import xcmg.device.service.vo.boxup.BoxupDetailVO;
import xcmg.device.service.vo.boxup.BoxupMaterialsQuery;
import xcmg.device.service.vo.delivery.BillDetailMaterialsVO;
import xcmg.device.service.vo.delivery.BoxUpDeliveryNoteVO;
import xcmg.device.service.vo.delivery.DeliveryNoteDetailVO;
import xcmg.device.service.vo.materialsSchedule.MaterialsScheduleDeliveryNoteDetailVO;
import xcmg.device.service.vo.safetyStock.MonthSalesVO;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

@Mapper
public interface DeliveryNoteDetailMapper {

    //增加
    int add(DeliveryNoteDetailDO deliveryNoteDetailDO);

    //删除
    int deleteByPrimaryKey(@Param("id") String id);

    DeliveryNoteDetailDO selectByPrimaryKey(@Param("id") String id);

    //更新
    int update(DeliveryNoteDetailDO deliveryNoteDetailDO);

    int delete(@Param("deliveryNoteNo") String deliveryNoteNo);

    int deleteReal(@Param("deliveryNoteNo") String deliveryNoteNo);

    List<DeliveryNoteDetailDO> list(@Param("deliveryNoteNo") String deliveryNoteNo);

    List<DeliveryNoteDetailDO> listBySaleNo(@Param("saleNo") String saleNo);

    List<DeliveryNoteDetailDO> listForLocationUser(@Param("deliveryNoteNo") String deliveryNoteNo);

    DeliveryNoteDetailDO itemByMaterialsNo(@Param("deliveryNoteNo") String deliveryNoteNo, @Param("materialsNo") String materialsNo);

    int count(@Param("id") String id);

    int remove(@Param("id") String id);

    int updateInventoryOut(DeliveryNoteDetailDO deliveryNoteDetailDO);

    List<DeliveryNoteDetailDO> listAll(DeliveryNoteDetailVO deliveryNoteDetailVO);

    BoxUpDeliveryNoteVO itemByNoAndMaterialsNo(@Param("orgId") String orgId, @Param("deliveryNoteNo") String deliveryNoteNo, @Param("materialsNo") String materialsNo);

    int updateSendNumber(DeliveryNoteDetailDO deliveryNoteDetailDO);

    DeliveryNoteDetailDO computeTotal(BoxupMaterialsQuery boxupMaterialsQuery);

    List<BoxupDetailVO> notPackList(BoxupMaterialsQuery boxupMaterialsQuery);

    int updateSendQty(@Param("orgId") String orgId, @Param("sendQty") BigDecimal sendQty, @Param("saleNo") String saleNo, @Param("materialsNo") String materialsNo);

    /**
     * 根据发货单号修改零件退货状态
     *
     * @param deliveryId String 发货单主键ID
     * @param status     Integer 退货状态（0未退货，1退货中，2退货完成）
     * @return int
     */
    int updateReturnStatusByNo(@Param("deliveryId") String deliveryId, @Param("status") Integer status);

    /**
     * 根据零件ID修改零件退货状态
     *
     * @param id     String 发货单中零件ID
     * @param status Integer 退货状态（0未退货，1退货中，2退货完成）
     * @return int
     */
    int updateReturnStatusById(@Param("id") String id, @Param("status") Integer status);

    List<BigDecimal> monthlySale(@Param("orgId") String orgId);

    List<BigDecimal> monthlyReturn(@Param("orgId") String orgId);

    BigDecimal deliveryNumber(@Param("deliveryNoteId") String deliveryNoteId);

    int updateStatus(@Param("status") String status, @Param("deliveryNo") String deliveryNo, @Param("materialsNo") String materialsNo);

    int findNumByState(@Param("saleNo") String saleNo, @Param("deliveryNo") String deliveryNo, @Param("materialsNo") String materialsNo, @Param("orgId") String orgId);

    List<BillDetailMaterialsVO> moreBillDetail(@Param("deliveryBillId") String deliveryBillId);

    /**
     * 根据发货通知单号更新
     * 发货明细的已出库数量
     *
     * @param deliveryNoteDetailNo
     * @return
     */
    int updateInventoryOutDirect(@Param("deliveryNoteDetailNo") String deliveryNoteDetailNo);

    int updatePriceByAdjust(@Param("id") String saleId);

    int updateTotalDiscountPriceByAdjust(@Param("id") String deliveryNoteId);

    /**
     * 按月获取零件出货量
     *
     * @param supplierOrgId
     * @param materialsNo
     * @param createMonth
     * @return
     */
    BigDecimal countOutAmountByMonth(@Param("supplierOrgId") String supplierOrgId,
                                     @Param("materialsNo") String materialsNo, @Param("createMonth") String createMonth);

    /**
     * 按月分组指定时间段内的出货数据
     *
     * @param supplierOrgId
     * @param materialsNo
     * @param startTime
     * @param endTime
     * @return
     */
    List<MonthSalesVO> countOutByMonthInterval(@Param("supplierOrgId") String supplierOrgId,
                                               @Param("materialsNo") String materialsNo, @Param("startTime") Date startTime, @Param("endTime") Date endTime);


    /**
     * 查询销售意向下某个零件已创建发货通知单的数量
     *
     * @param saleNo
     * @param materialsNo
     * @return
     */
    BigDecimal countDeliveryQty(@Param("saleNo") String saleNo, @Param("materialsNo") String materialsNo);

    //获取销售意向调整后的数量
    BigDecimal getAmountAfterAdjust(@Param("saleNo") String saleNo, @Param("materialsNo") String materialsNo);

    //获取已发送数量
    BigDecimal getSendQty(@Param("saleNo") String saleNo, @Param("materialsNo") String materialsNo);

    String getCreatedDeliverys(@Param("saleNo") String saleNo, @Param("materialsNo") String materialsNo);

    BigDecimal getDeliveryQty(@Param("saleNo") String saleNo, @Param("materialsNo") String materialsNo, @Param("deliveryId") String deliveryId);

    String getIdByDeliveryNo(@Param("deliveryNo") String deliveryNo, @Param("materialsNo") String materialsNo);

    List<DeliveryNoteDetailDO> getMaterialInfoByDeliveryNo(List<String> deliveryNoList);

    boolean updateByDeliveryNoteNoAndMaterialNo(DeliveryNoteDetailDO deliveryNoteDetailDO);

    List<DeliveryNoteDetailDO> listByDeliveryNoteIds(List<String> deliveryNoteIds);

    DeliveryNoteDetailDO selectByDeliveryNoteIdAndMaterial(@Param("deliveryNoteId") String deliveryNoteId, @Param("materialsNo") String materialsNo);

    BigDecimal getDeliveryQtyByReceiptId(@Param("orgId") String orgId, @Param("deliveryReceiptId") String deliveryReceiptId, @Param("materialsNo") String materialsNo);

    List<MaterialsScheduleDeliveryNoteDetailVO> materialsScheduleSelectDeliveryNoteDetails(String deliveryNoteId);
}
